/**
 * Copyright 2009 - ChunMap
 * 
 * 这个文件是ChunMap项目的一部分。
 * ChunMap是开源软件。
 * 你可以自由复制、传播本项目的下载包文件，但必须保持其完整性。
 * 我们不用对使用中的风险及由此造成的损失承担任何责任。
 * 详细情况请见《ChunMap许可协议》。

 * 想了解更多有关ChunMap的信息，请访问http://code.google.com/p/chunmap/
 */
package chunmap.orm.sql;

import java.util.ArrayList;
import java.util.List;

import chunmap.orm.mapping.Table;
import chunmap.orm.sql.maker.InsertMaker;
import chunmap.orm.sql.maker.SelectMaker;
import chunmap.orm.sql.maker.TableMaker;
import chunmap.orm.sql.maker.UpdateMaker;
import chunmap.orm.sql.maker.UtilsMaker;
import chunmap.util.Function;

public class PostgreSqlMaker implements SqlMaker {

	private Table table;
	public PostgreSqlMaker() {
	}
	
	@Override
	public void setTable(Table table){this.table=table;}
	@Override
	public Table getTable(){return table;}
	
	@Override
	public Sql selectWhere(String where){
		String sql=SelectMaker.getSelectString(table);
		return createSql(sql,where,Sql.QueryExecute);
	}
	
	@Override
	public Sql selectById(Object id){
		return SelectMaker.getSelectByIdSql(table, id);
	}
	
	@Override
	public Sql insert(Object object){
		return InsertMaker.getSql(table, object);
	}
	
	@Override
	public Sql countWhere(String count , String where){
		String sql="select "+count+" from " + table.getName();
		return createSql(sql,where,Sql.QueryExecute);
	}
	
	@Override
	public Sql deleteWhere(String where){
		String sql = "delete from " + table.getName();
		return createSql(sql,where,Sql.UpdateExecute);
	}
	
	@Override
	public Sql delete(Object obj){
		final StringBuilder s = new StringBuilder();
		s.append("delete from "+table.getName());

		return UtilsMaker.buildSqlByFindId(s, table, obj,Sql.NoneExecute,1);
	}
	
	@Override
	public Sql update(Object obj){
		return UpdateMaker.getUpdateSql(table, obj,null);
	}
	
	@Override
	public Sql updateWhere(String where ,Object obj,Function filter){
		final List<SqlParameter> sqlParameters=new ArrayList<SqlParameter>();
		String s=UpdateMaker.getUpdateString(table, obj, sqlParameters,filter);
		Sql sql= createSql(s,where,Sql.UpdateExecute);
		sql.addAllSqlParameters(sqlParameters);
		return sql;
	}
	
	@Override
	public Sql createTable(){
		return TableMaker.createTableSql(table);
	}
	
	@Override
	public Sql dropTable(){
		String sql = "drop table " + table.getName();
		return new Sql(sql,Sql.NoneExecute);
	}
	
	private Sql createSql(String sql,String where,int type){
		if (where == null || where.equals(""))
			return new Sql(sql,type);
		return new Sql(sql + " where " + where,type);
	}

}
